library(tidyverse)
library(data.table)
library(biomaRt)
library(ggbeeswarm)

select = dplyr::select
rename = dplyr::rename

source R profile. Memory was set to 500000.

Sys.setenv("R_ENVIRON_USER"='/Users/castilln/.Renviron')
Sys.getenv("R_ENVIRON_USER")
[1] "/Users/castilln/.Renviron"

Set wd

Load data

library(readr)
#mskcc gene list
data_mutations_mskcc <- read_delim("msk-impact/msk_impact_2017/data_mutations_mskcc.txt", 
    "\t", escape_double = FALSE, trim_ws = TRUE, 
    skip = 1)

── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_logical(),
  Hugo_Symbol = col_character(),
  NCBI_Build = col_character(),
  Chromosome = col_character(),
  Start_Position = col_double(),
  End_Position = col_double(),
  Strand = col_character(),
  Consequence = col_character(),
  Variant_Classification = col_character(),
  Variant_Type = col_character(),
  Reference_Allele = col_character(),
  Tumor_Seq_Allele1 = col_character(),
  Tumor_Seq_Allele2 = col_character(),
  Tumor_Sample_Barcode = col_character(),
  t_ref_count = col_double(),
  t_alt_count = col_double(),
  HGVSc = col_character(),
  HGVSp = col_character(),
  HGVSp_Short = col_character(),
  Transcript_ID = col_character(),
  RefSeq = col_character()
  # ... with 4 more columns
)
ℹ Use `spec()` for the full column specifications.
#sensitivity data
drug_sens = fread("depmap/drug_sensitivity/primary-screen-replicate-collapsed-logfold-change.csv")

#drug metadata
meta_drug = fread("depmap/drug_sensitivity/primary-screen-replicate-treatment-info.csv")

#somatic mutations depmap
ccle <- fread("depmap/CCLE_info")
|--------------------------------------------------|
|==================================================|
|--------------------------------------------------|
|==================================================|

Format dfs

#rename variables
mskcc = 
  data_mutations_mskcc %>% 
  dplyr::select(-c("Entrez_Gene_Id", "Center")) %>% 
  dplyr::rename("SYMBOL" = "Hugo_Symbol")

head(mskcc)

Join drug data with metadata

drug_sens = 
  drug_sens %>% 
  rename("DepMap_ID" = "V1")

#pivot longer and join metadata 
long_sensitivity = 
  drug_sens %>% 
  pivot_longer(cols = -DepMap_ID, names_to = "broad_id", values_to = "sensitivity") 

#take away information after :: in broad_id
long_sensitivity =
  as.data.frame(lapply(long_sensitivity, function(y) gsub(":.*", "", y)))

#join meta data
sensitivity_meta = 
  long_sensitivity %>% 
  left_join(meta_drug, by = "broad_id") %>% 
  rename("SYMBOL" = "target")

head(sensitivity_meta)

Filter the results from SpliceAI for genes in MSKIMPACT panel

##RESULTS FROM SPLICEAI
splice_out_ann = readRDS("spliceai/spliceAI05_Annotated.rds")

#FILTER THOSE GENES IN MSKCC WITH PREDICTED SPLICE VARIANTS
df_splice_actionable =
  mskcc %>% 
  select(SYMBOL) %>% 
  distinct() %>%
  left_join(splice_out_ann, by = "SYMBOL") %>% 
  distinct()

head(df_splice_actionable)
#dup = duplicated(df_splice_actionable)
#df_splice_actionable[dup,]

#dup_splice = duplicated(splice_out_ann)
#sum(dup_splice)

df_splice_actionable %>% 
  ggplot(aes(y = SYMBOL, group = SYMBOL)) +
  geom_bar()


df_splice_actionable %>% 
  group_by(SYMBOL) %>% 
  mutate(var_per_gene = length(SYMBOL)) %>% 
  ungroup() %>% 
  select(SYMBOL,var_per_gene) %>% 
  distinct() %>% 
  arrange(desc(var_per_gene))
## CREATE NEW COLUMN TO INDICATE THAT THE GENE HAS A PREDICTED VARIANT
df_splice_actionable = 
  df_splice_actionable %>% 
  mutate(splice_mutation = 1,
         splice_gene = SYMBOL) %>%
  select(DepMap_ID,SYMBOL,primary_disease,splice_mutation,splice_gene)

## GET LIST OF ACTIONABLE GENES
actionable_genes =
  df_splice_actionable %>% 
  select(SYMBOL) %>% 
  distinct() %>% 
  pull() 

length(actionable_genes)
[1] 414
# Filter oput MSKCC IMPACT genes
df_mskcc_sensitivity =
  sensitivity_meta %>% 
  filter(SYMBOL %in% actionable_genes)

head(df_mskcc_sensitivity)
actionable_genes_drug = 
df_splice_actionable %>% 
  inner_join(df_mskcc_sensitivity, by = c("DepMap_ID","SYMBOL")) %>% 
  filter(!is.na(sensitivity)) %>% 
  mutate(splice_mutation = ifelse(is.na(splice_mutation),0,1)) %>% 
  select(SYMBOL) %>% 
  distinct()  

head(actionable_genes_drug)
  
#dim(actionable_genes_drug)

Plot per gene, all

library(ggpubr)
#select only those with alterations in more than 10 cell lines
actionable_genes_all = 
  df_splice_actionable %>% 
  group_by(SYMBOL) %>% 
  mutate(var_per_gene = length(SYMBOL)) %>% 
  ungroup() %>% 
  select(DepMap_ID, SYMBOL, var_per_gene) %>% 
  distinct() %>% 
  filter(var_per_gene >3)

sensitivity_meta_more = 
  sensitivity_meta %>% 
  filter(SYMBOL %in% actionable_genes_all$SYMBOL) %>% 
  distinct()

df_plot = 
df_splice_actionable %>% 
  full_join(sensitivity_meta_more, by = c("DepMap_ID","SYMBOL")) %>% 
  filter(!is.na(sensitivity)) %>% 
  mutate(splice_mutation = as.character(splice_mutation)) %>% 
  mutate(splice_mutation = ifelse(is.na(splice_mutation),"WT","Var")) %>% 
  distinct() %>% 
  select(SYMBOL, splice_mutation, DepMap_ID, sensitivity) %>% 
  distinct() 

df_plot$sensitivity = 
  as.numeric(df_plot$sensitivity)

df_plot$sensitivity = 
  round(df_plot$sensitivity, digits = 3)


  ggplot(df_plot, aes(y = sensitivity,x = splice_mutation)) + 
  geom_boxplot(aes(x = splice_mutation,color = splice_mutation)) +
  geom_quasirandom(method = "pseudorandom",alpha = 0.5, size = 0.5) + 
  theme_bw() +
  facet_wrap("SYMBOL", scales = "free") +
  scale_color_manual(values = c("red","black")) +
  xlab("") +
  ylab("Sensitivity to drug (sd from median)") +
  theme(axis.text.x = element_blank(),
        legend.position = "bottom", 
        ) +
    stat_compare_means(label = "p.format")

  
  #ggsave("../figures/results/msk_impact/drug/spliceAI_actionablegenes_drugsensitivity_all.png")

Filter for variants with more than 10 cell lines affected

#select only those with alterations in more than 10 cell lines
actionable_genes_more_5_cellines = 
  df_splice_actionable %>% 
  group_by(SYMBOL) %>% 
  mutate(var_per_gene = length(SYMBOL)) %>% 
  ungroup() %>% 
  select(DepMap_ID, SYMBOL, var_per_gene) %>% 
  filter(var_per_gene > 5) %>% 
  distinct()

sensitivity_meta_more = 
  sensitivity_meta %>% 
  filter(SYMBOL %in% actionable_genes_more_5_cellines$SYMBOL) %>% 
  distinct()

df_plot = 
df_splice_actionable %>% 
  full_join(sensitivity_meta_more, by = c("DepMap_ID","SYMBOL")) %>% 
  filter(!is.na(sensitivity)) %>% 
  mutate(splice_mutation = as.character(splice_mutation)) %>% 
  mutate(splice_mutation = ifelse(is.na(splice_mutation),"WT","Var")) %>% 
  distinct() %>% 
  select(SYMBOL, splice_mutation, DepMap_ID, sensitivity) %>% 
  distinct() 

df_plot$sensitivity = 
  as.numeric(df_plot$sensitivity)

df_plot$sensitivity = 
  round(df_plot$sensitivity, digits = 3)


  ggplot(df_plot, aes(y = sensitivity,x = splice_mutation, color = splice_mutation)) + 
  geom_boxplot(aes(x = splice_mutation)) +
  geom_quasirandom(method = "pseudorandom",alpha = 0.5, size = 0.5) + 
  theme_bw() +
  facet_wrap("SYMBOL", scales = "free") +
  scale_color_manual(values = c("red","black")) +
  xlab("") +
  ylab("Sensitivity to drug (sd from median)") +
  theme(axis.text.x = element_blank(),
        legend.position = "bottom", 
        )


  
#ggsave("../figures/results/msk_impact/drug/spliceAI_actionablegenes_drugsensitivity_more5.png")

Plot per drug, all

library(ggpubr)

actionable_genes_all = 
  df_splice_actionable %>% 
  group_by(SYMBOL) %>% 
  mutate(var_per_gene = length(SYMBOL)) %>% 
  ungroup() %>% 
  select(DepMap_ID, SYMBOL, var_per_gene) %>% 
  filter(var_per_gene >= 3) %>% 
  distinct()

sensitivity_meta = 
  sensitivity_meta %>% 
  filter(SYMBOL %in% actionable_genes_all$SYMBOL) %>% 
  distinct()
head(sensitivity_meta)

plot_drug =  
  df_splice_actionable %>% 
  full_join(sensitivity_meta, by = c("DepMap_ID","SYMBOL")) %>% 
  filter(!is.na(sensitivity)) %>% 
  mutate(splice_mutation = as.character(splice_mutation)) %>% 
  mutate(splice_mutation = ifelse(is.na(splice_mutation),"WT","Var")) %>% 
  distinct() %>%
  select(SYMBOL, splice_mutation, DepMap_ID, sensitivity, broad_id, name) %>% 
  distinct() 

#transform sensitivity to numeric
plot_drug$sensitivity = 
  as.numeric(plot_drug$sensitivity)

#round sensitivity data to 3 decimals
plot_drug$sensitivity = 
  round(plot_drug$sensitivity, digits = 3)

your_font_size <- 2


  ggplot(plot_drug %>%  mutate(group = paste(name, SYMBOL, sep = "-")), aes(y = sensitivity,x = splice_mutation, color = splice_mutation)) + 
  geom_boxplot(aes(x = splice_mutation)) +
  geom_quasirandom(method = "pseudorandom",alpha = 0.5, size = 0.5) + 
  theme_bw() +
  facet_wrap("group") +
  scale_color_manual(values = c("red","black")) +
  xlab("") +
  ylab("Sensitivity to drug (sd from median)") +
  theme(axis.text.x = element_blank(),
        legend.position = "bottom", 
        ) + 
    stat_compare_means(method = "t.test", label = "p.format", label.y = 2.8, label.x = 0.6, size = your_font_size)

  
#ggsave("../figures/results/msk_impact/drug/spliceAI_actionablegenes_drugsensitivity_perDrug_t_test.png", height = 20, width = 23)

Plot per drug, filter for cell lines with more than 10 variants

actionable_genes_5 = 
  df_splice_actionable %>% 
  group_by(SYMBOL) %>% 
  mutate(var_per_gene = length(SYMBOL)) %>% 
  ungroup() %>% 
  select(DepMap_ID, SYMBOL, var_per_gene) %>% 
  filter(var_per_gene >5 ) %>%
  distinct()

sensitivity_meta_5 = 
  sensitivity_meta %>% 
  filter(SYMBOL %in% actionable_genes_5$SYMBOL) %>% 
  distinct()

head(sensitivity_meta)

plot_drug =  
  df_splice_actionable %>% 
  full_join(sensitivity_meta_5, by = c("DepMap_ID","SYMBOL")) %>% 
  filter(!is.na(sensitivity)) %>% 
  mutate(splice_mutation = as.character(splice_mutation)) %>% 
  mutate(splice_mutation = ifelse(is.na(splice_mutation),"WT","Var")) %>% 
  distinct() %>%
  select(SYMBOL, splice_mutation, DepMap_ID, sensitivity, broad_id, name) %>% 
  distinct() 

#transform sensitivity to numeric
plot_drug$sensitivity = 
  as.numeric(plot_drug$sensitivity)

#round sensitivity data to 3 decimals
plot_drug$sensitivity = 
  round(plot_drug$sensitivity, digits = 3)
##PLOT
  ggplot(plot_drug %>%  mutate(group = paste(name, SYMBOL, sep = "-")), aes(y = sensitivity,x = splice_mutation)) + 
  geom_boxplot(aes(x = splice_mutation, color = splice_mutation)) +
  #geom_jitter(alpha = 0.5, size = 0.5) +
  geom_beeswarm(method = "pseudorandom",alpha = 0.2, size = 0.5) + 
  theme_bw() +
  facet_wrap("group") +
  scale_color_manual(values = c("red","gray")) +
  xlab("") +
  ylab("Sensitivity to drug (sd from median)") +
  theme(axis.text.x = element_blank(),
        legend.position = "bottom", 
        ) + 
    stat_compare_means(method = "t.test", label = "p.format", label.y = -6, label.x = 1)
Ignoring unknown parameters: method

Repeat plot without faceting, per disease

##ANNOTATE DISEASE
disease = 
  ccle %>% 
  select(DepMap_ID, primary_disease) %>% 
  distinct()

sensitivity_meta_dis = 
  sensitivity_meta %>% 
  filter(SYMBOL %in% actionable_genes_all$SYMBOL) %>% 
  distinct() %>% 
  left_join(disease, by = "DepMap_ID")

plot_drug_dis = 
  df_splice_actionable %>% 
  full_join(sensitivity_meta_dis, by = c("DepMap_ID","SYMBOL")) %>% 
  filter(!is.na(sensitivity)) %>% 
  mutate(splice_mutation = as.character(splice_mutation)) %>% 
  mutate(splice_mutation = ifelse(is.na(splice_mutation),"WT","Var")) %>% 
  distinct() %>%
  select(SYMBOL, splice_mutation, DepMap_ID, sensitivity, broad_id, name, primary_disease.y) %>% 
  rename("primary_disease" = "primary_disease.y")

#transform sensitivity to numeric
plot_drug_dis$sensitivity = 
  as.numeric(plot_drug_dis$sensitivity)

#round sensitivity data to 3 decimals
plot_drug_dis$sensitivity = 
  round(plot_drug_dis$sensitivity, digits = 3)

##PLOT
  ggplot(plot_drug_dis, aes(y = sensitivity,x = splice_mutation)) + 
  geom_boxplot(aes(x = splice_mutation, color = splice_mutation)) +
  geom_quasirandom(method = "pseudorandom",alpha = 0.5, size = 0.5) + 
  facet_wrap("primary_disease") +
  theme_bw() +
  scale_color_manual(values = c("red","black")) +
  xlab("") +
  ylab("Sensitivity to drug (sd from median)") +
  theme(axis.text.x = element_blank(),
        legend.position = "bottom", 
        ) + 
    stat_compare_means(method = "t.test", label = "p.format", label.y = 2.5, label.x = 0.8)

ggsave("../figures/results/msk_impact/drug/spliceAI_actionablegenes_drugsensitivity_ttest_PERCANCER.png", height = 10, width = 10)
LS0tCnRpdGxlOiAiTVNLQ0MtSU1QQUNUIERydWcgc2Vuc2l0aXZpdHkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KGJpb21hUnQpCmxpYnJhcnkoZ2diZWVzd2FybSkKCnNlbGVjdCA9IGRwbHlyOjpzZWxlY3QKcmVuYW1lID0gZHBseXI6OnJlbmFtZQpgYGAKc291cmNlIFIgcHJvZmlsZS4gTWVtb3J5IHdhcyBzZXQgdG8gNTAwMDAwLgpgYGB7cn0KU3lzLnNldGVudigiUl9FTlZJUk9OX1VTRVIiPScvVXNlcnMvY2FzdGlsbG4vLlJlbnZpcm9uJykKU3lzLmdldGVudigiUl9FTlZJUk9OX1VTRVIiKQoKYGBgCgpTZXQgd2QgCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBlY2hvPUZBTFNFfQpyZXF1aXJlKCJrbml0ciIpCm9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiL1VzZXJzL2Nhc3RpbGxuL0Rlc2t0b3AvdGhlc2lzL2xvY2FsZGF0YSIpCmBgYAoKTG9hZCBkYXRhCmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQojbXNrY2MgZ2VuZSBsaXN0CmRhdGFfbXV0YXRpb25zX21za2NjIDwtIHJlYWRfZGVsaW0oIm1zay1pbXBhY3QvbXNrX2ltcGFjdF8yMDE3L2RhdGFfbXV0YXRpb25zX21za2NjLnR4dCIsIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgCiAgICBza2lwID0gMSkKCiNzZW5zaXRpdml0eSBkYXRhCmRydWdfc2VucyA9IGZyZWFkKCJkZXBtYXAvZHJ1Z19zZW5zaXRpdml0eS9wcmltYXJ5LXNjcmVlbi1yZXBsaWNhdGUtY29sbGFwc2VkLWxvZ2ZvbGQtY2hhbmdlLmNzdiIpCgojZHJ1ZyBtZXRhZGF0YQptZXRhX2RydWcgPSBmcmVhZCgiZGVwbWFwL2RydWdfc2Vuc2l0aXZpdHkvcHJpbWFyeS1zY3JlZW4tcmVwbGljYXRlLXRyZWF0bWVudC1pbmZvLmNzdiIpCgojc29tYXRpYyBtdXRhdGlvbnMgZGVwbWFwCmNjbGUgPC0gZnJlYWQoImRlcG1hcC9DQ0xFX2luZm8iKQpgYGAKCkZvcm1hdCBkZnMKYGBge3J9CiNyZW5hbWUgdmFyaWFibGVzCm1za2NjID0gCiAgZGF0YV9tdXRhdGlvbnNfbXNrY2MgJT4lIAogIGRwbHlyOjpzZWxlY3QoLWMoIkVudHJlel9HZW5lX0lkIiwgIkNlbnRlciIpKSAlPiUgCiAgZHBseXI6OnJlbmFtZSgiU1lNQk9MIiA9ICJIdWdvX1N5bWJvbCIpCgpoZWFkKG1za2NjKQpgYGAKCkpvaW4gZHJ1ZyBkYXRhIHdpdGggbWV0YWRhdGEgCmBgYHtyfQpkcnVnX3NlbnMgPSAKICBkcnVnX3NlbnMgJT4lIAogIHJlbmFtZSgiRGVwTWFwX0lEIiA9ICJWMSIpCgojcGl2b3QgbG9uZ2VyIGFuZCBqb2luIG1ldGFkYXRhIApsb25nX3NlbnNpdGl2aXR5ID0gCiAgZHJ1Z19zZW5zICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IC1EZXBNYXBfSUQsIG5hbWVzX3RvID0gImJyb2FkX2lkIiwgdmFsdWVzX3RvID0gInNlbnNpdGl2aXR5IikgCgojdGFrZSBhd2F5IGluZm9ybWF0aW9uIGFmdGVyIDo6IGluIGJyb2FkX2lkCmxvbmdfc2Vuc2l0aXZpdHkgPQogIGFzLmRhdGEuZnJhbWUobGFwcGx5KGxvbmdfc2Vuc2l0aXZpdHksIGZ1bmN0aW9uKHkpIGdzdWIoIjouKiIsICIiLCB5KSkpCgojam9pbiBtZXRhIGRhdGEKc2Vuc2l0aXZpdHlfbWV0YSA9IAogIGxvbmdfc2Vuc2l0aXZpdHkgJT4lIAogIGxlZnRfam9pbihtZXRhX2RydWcsIGJ5ID0gImJyb2FkX2lkIikgJT4lIAogIHJlbmFtZSgiU1lNQk9MIiA9ICJ0YXJnZXQiKQoKaGVhZChzZW5zaXRpdml0eV9tZXRhKQpgYGAKRmlsdGVyIHRoZSByZXN1bHRzIGZyb20gU3BsaWNlQUkgZm9yIGdlbmVzIGluIE1TS0lNUEFDVCBwYW5lbApgYGB7cn0KIyNSRVNVTFRTIEZST00gU1BMSUNFQUkKc3BsaWNlX291dF9hbm4gPSByZWFkUkRTKCJzcGxpY2VhaS9zcGxpY2VBSTA1X0Fubm90YXRlZC5yZHMiKQoKI0ZJTFRFUiBUSE9TRSBHRU5FUyBJTiBNU0tDQyBXSVRIIFBSRURJQ1RFRCBTUExJQ0UgVkFSSUFOVFMKZGZfc3BsaWNlX2FjdGlvbmFibGUgPQogIG1za2NjICU+JSAKICBzZWxlY3QoU1lNQk9MKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUKICBsZWZ0X2pvaW4oc3BsaWNlX291dF9hbm4sIGJ5ID0gIlNZTUJPTCIpICU+JSAKICBkaXN0aW5jdCgpCgpoZWFkKGRmX3NwbGljZV9hY3Rpb25hYmxlKQojZHVwID0gZHVwbGljYXRlZChkZl9zcGxpY2VfYWN0aW9uYWJsZSkKI2RmX3NwbGljZV9hY3Rpb25hYmxlW2R1cCxdCgojZHVwX3NwbGljZSA9IGR1cGxpY2F0ZWQoc3BsaWNlX291dF9hbm4pCiNzdW0oZHVwX3NwbGljZSkKCmRmX3NwbGljZV9hY3Rpb25hYmxlICU+JSAKICBnZ3Bsb3QoYWVzKHkgPSBTWU1CT0wsIGdyb3VwID0gU1lNQk9MKSkgKwogIGdlb21fYmFyKCkKCmRmX3NwbGljZV9hY3Rpb25hYmxlICU+JSAKICBncm91cF9ieShTWU1CT0wpICU+JSAKICBtdXRhdGUodmFyX3Blcl9nZW5lID0gbGVuZ3RoKFNZTUJPTCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdChTWU1CT0wsdmFyX3Blcl9nZW5lKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhcl9wZXJfZ2VuZSkpCmBgYAoKYGBge3J9CiMjIENSRUFURSBORVcgQ09MVU1OIFRPIElORElDQVRFIFRIQVQgVEhFIEdFTkUgSEFTIEEgUFJFRElDVEVEIFZBUklBTlQKZGZfc3BsaWNlX2FjdGlvbmFibGUgPSAKICBkZl9zcGxpY2VfYWN0aW9uYWJsZSAlPiUgCiAgbXV0YXRlKHNwbGljZV9tdXRhdGlvbiA9IDEsCiAgICAgICAgIHNwbGljZV9nZW5lID0gU1lNQk9MKSAlPiUKICBzZWxlY3QoRGVwTWFwX0lELFNZTUJPTCxwcmltYXJ5X2Rpc2Vhc2Usc3BsaWNlX211dGF0aW9uLHNwbGljZV9nZW5lKQoKIyMgR0VUIExJU1QgT0YgQUNUSU9OQUJMRSBHRU5FUwphY3Rpb25hYmxlX2dlbmVzID0KICBkZl9zcGxpY2VfYWN0aW9uYWJsZSAlPiUgCiAgc2VsZWN0KFNZTUJPTCkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIHB1bGwoKSAKCmxlbmd0aChhY3Rpb25hYmxlX2dlbmVzKQoKIyBGaWx0ZXIgb3B1dCBNU0tDQyBJTVBBQ1QgZ2VuZXMKZGZfbXNrY2Nfc2Vuc2l0aXZpdHkgPQogIHNlbnNpdGl2aXR5X21ldGEgJT4lIAogIGZpbHRlcihTWU1CT0wgJWluJSBhY3Rpb25hYmxlX2dlbmVzKQoKaGVhZChkZl9tc2tjY19zZW5zaXRpdml0eSkKYGBgCgpgYGB7cn0KYWN0aW9uYWJsZV9nZW5lc19kcnVnID0gCmRmX3NwbGljZV9hY3Rpb25hYmxlICU+JSAKICBpbm5lcl9qb2luKGRmX21za2NjX3NlbnNpdGl2aXR5LCBieSA9IGMoIkRlcE1hcF9JRCIsIlNZTUJPTCIpKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShzZW5zaXRpdml0eSkpICU+JSAKICBtdXRhdGUoc3BsaWNlX211dGF0aW9uID0gaWZlbHNlKGlzLm5hKHNwbGljZV9tdXRhdGlvbiksMCwxKSkgJT4lIAogIHNlbGVjdChTWU1CT0wpICU+JSAKICBkaXN0aW5jdCgpICAKCmhlYWQoYWN0aW9uYWJsZV9nZW5lc19kcnVnKQogIAojZGltKGFjdGlvbmFibGVfZ2VuZXNfZHJ1ZykKYGBgCgpQbG90IHBlciBnZW5lLCBhbGwKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0KbGlicmFyeShnZ3B1YnIpCiNzZWxlY3Qgb25seSB0aG9zZSB3aXRoIGFsdGVyYXRpb25zIGluIG1vcmUgdGhhbiAxMCBjZWxsIGxpbmVzCmFjdGlvbmFibGVfZ2VuZXNfYWxsID0gCiAgZGZfc3BsaWNlX2FjdGlvbmFibGUgJT4lIAogIGdyb3VwX2J5KFNZTUJPTCkgJT4lIAogIG11dGF0ZSh2YXJfcGVyX2dlbmUgPSBsZW5ndGgoU1lNQk9MKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgc2VsZWN0KERlcE1hcF9JRCwgU1lNQk9MLCB2YXJfcGVyX2dlbmUpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBmaWx0ZXIodmFyX3Blcl9nZW5lID4zKQoKc2Vuc2l0aXZpdHlfbWV0YV9tb3JlID0gCiAgc2Vuc2l0aXZpdHlfbWV0YSAlPiUgCiAgZmlsdGVyKFNZTUJPTCAlaW4lIGFjdGlvbmFibGVfZ2VuZXNfYWxsJFNZTUJPTCkgJT4lIAogIGRpc3RpbmN0KCkKCmRmX3Bsb3QgPSAKZGZfc3BsaWNlX2FjdGlvbmFibGUgJT4lIAogIGZ1bGxfam9pbihzZW5zaXRpdml0eV9tZXRhX21vcmUsIGJ5ID0gYygiRGVwTWFwX0lEIiwiU1lNQk9MIikpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHNlbnNpdGl2aXR5KSkgJT4lIAogIG11dGF0ZShzcGxpY2VfbXV0YXRpb24gPSBhcy5jaGFyYWN0ZXIoc3BsaWNlX211dGF0aW9uKSkgJT4lIAogIG11dGF0ZShzcGxpY2VfbXV0YXRpb24gPSBpZmVsc2UoaXMubmEoc3BsaWNlX211dGF0aW9uKSwiV1QiLCJWYXIiKSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIHNlbGVjdChTWU1CT0wsIHNwbGljZV9tdXRhdGlvbiwgRGVwTWFwX0lELCBzZW5zaXRpdml0eSkgJT4lIAogIGRpc3RpbmN0KCkgCgpkZl9wbG90JHNlbnNpdGl2aXR5ID0gCiAgYXMubnVtZXJpYyhkZl9wbG90JHNlbnNpdGl2aXR5KQoKZGZfcGxvdCRzZW5zaXRpdml0eSA9IAogIHJvdW5kKGRmX3Bsb3Qkc2Vuc2l0aXZpdHksIGRpZ2l0cyA9IDMpCgoKICBnZ3Bsb3QoZGZfcGxvdCwgYWVzKHkgPSBzZW5zaXRpdml0eSx4ID0gc3BsaWNlX211dGF0aW9uKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKHggPSBzcGxpY2VfbXV0YXRpb24sY29sb3IgPSBzcGxpY2VfbXV0YXRpb24pKSArCiAgZ2VvbV9xdWFzaXJhbmRvbShtZXRob2QgPSAicHNldWRvcmFuZG9tIixhbHBoYSA9IDAuNSwgc2l6ZSA9IDAuNSkgKyAKICB0aGVtZV9idygpICsKICBmYWNldF93cmFwKCJTWU1CT0wiLCBzY2FsZXMgPSAiZnJlZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicmVkIiwiYmxhY2siKSkgKwogIHhsYWIoIiIpICsKICB5bGFiKCJTZW5zaXRpdml0eSB0byBkcnVnIChzZCBmcm9tIG1lZGlhbikiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICAgICAgICkgKwogICAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuZm9ybWF0IikKICAKICAjZ2dzYXZlKCIuLi9maWd1cmVzL3Jlc3VsdHMvbXNrX2ltcGFjdC9kcnVnL3NwbGljZUFJX2FjdGlvbmFibGVnZW5lc19kcnVnc2Vuc2l0aXZpdHlfYWxsLnBuZyIpCgpgYGAKCgpGaWx0ZXIgZm9yIHZhcmlhbnRzIHdpdGggbW9yZSB0aGFuIDEwIGNlbGwgbGluZXMgYWZmZWN0ZWQKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0KI3NlbGVjdCBvbmx5IHRob3NlIHdpdGggYWx0ZXJhdGlvbnMgaW4gbW9yZSB0aGFuIDEwIGNlbGwgbGluZXMKYWN0aW9uYWJsZV9nZW5lc19tb3JlXzVfY2VsbGluZXMgPSAKICBkZl9zcGxpY2VfYWN0aW9uYWJsZSAlPiUgCiAgZ3JvdXBfYnkoU1lNQk9MKSAlPiUgCiAgbXV0YXRlKHZhcl9wZXJfZ2VuZSA9IGxlbmd0aChTWU1CT0wpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBzZWxlY3QoRGVwTWFwX0lELCBTWU1CT0wsIHZhcl9wZXJfZ2VuZSkgJT4lIAogIGZpbHRlcih2YXJfcGVyX2dlbmUgPiA1KSAlPiUgCiAgZGlzdGluY3QoKQoKc2Vuc2l0aXZpdHlfbWV0YV9tb3JlID0gCiAgc2Vuc2l0aXZpdHlfbWV0YSAlPiUgCiAgZmlsdGVyKFNZTUJPTCAlaW4lIGFjdGlvbmFibGVfZ2VuZXNfbW9yZV81X2NlbGxpbmVzJFNZTUJPTCkgJT4lIAogIGRpc3RpbmN0KCkKCmRmX3Bsb3QgPSAKZGZfc3BsaWNlX2FjdGlvbmFibGUgJT4lIAogIGZ1bGxfam9pbihzZW5zaXRpdml0eV9tZXRhX21vcmUsIGJ5ID0gYygiRGVwTWFwX0lEIiwiU1lNQk9MIikpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHNlbnNpdGl2aXR5KSkgJT4lIAogIG11dGF0ZShzcGxpY2VfbXV0YXRpb24gPSBhcy5jaGFyYWN0ZXIoc3BsaWNlX211dGF0aW9uKSkgJT4lIAogIG11dGF0ZShzcGxpY2VfbXV0YXRpb24gPSBpZmVsc2UoaXMubmEoc3BsaWNlX211dGF0aW9uKSwiV1QiLCJWYXIiKSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIHNlbGVjdChTWU1CT0wsIHNwbGljZV9tdXRhdGlvbiwgRGVwTWFwX0lELCBzZW5zaXRpdml0eSkgJT4lIAogIGRpc3RpbmN0KCkgCgpkZl9wbG90JHNlbnNpdGl2aXR5ID0gCiAgYXMubnVtZXJpYyhkZl9wbG90JHNlbnNpdGl2aXR5KQoKZGZfcGxvdCRzZW5zaXRpdml0eSA9IAogIHJvdW5kKGRmX3Bsb3Qkc2Vuc2l0aXZpdHksIGRpZ2l0cyA9IDMpCgoKICBnZ3Bsb3QoZGZfcGxvdCwgYWVzKHkgPSBzZW5zaXRpdml0eSx4ID0gc3BsaWNlX211dGF0aW9uLCBjb2xvciA9IHNwbGljZV9tdXRhdGlvbikpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gc3BsaWNlX211dGF0aW9uKSkgKwogIGdlb21fcXVhc2lyYW5kb20obWV0aG9kID0gInBzZXVkb3JhbmRvbSIsYWxwaGEgPSAwLjUsIHNpemUgPSAwLjUpICsgCiAgdGhlbWVfYncoKSArCiAgZmFjZXRfd3JhcCgiU1lNQk9MIiwgc2NhbGVzID0gImZyZWUiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInJlZCIsImJsYWNrIikpICsKICB4bGFiKCIiKSArCiAgeWxhYigiU2Vuc2l0aXZpdHkgdG8gZHJ1ZyAoc2QgZnJvbSBtZWRpYW4pIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICApCgogIAojZ2dzYXZlKCIuLi9maWd1cmVzL3Jlc3VsdHMvbXNrX2ltcGFjdC9kcnVnL3NwbGljZUFJX2FjdGlvbmFibGVnZW5lc19kcnVnc2Vuc2l0aXZpdHlfbW9yZTUucG5nIikKYGBgCgoKUGxvdCBwZXIgZHJ1ZywgYWxsCmBgYHtyLCBmaWcud2lkdGg9IDIwLCBmaWcuaGVpZ2h0PSAyMCwgd2FybmluZz1GfQpsaWJyYXJ5KGdncHVicikKCmFjdGlvbmFibGVfZ2VuZXNfYWxsID0gCiAgZGZfc3BsaWNlX2FjdGlvbmFibGUgJT4lIAogIGdyb3VwX2J5KFNZTUJPTCkgJT4lIAogIG11dGF0ZSh2YXJfcGVyX2dlbmUgPSBsZW5ndGgoU1lNQk9MKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgc2VsZWN0KERlcE1hcF9JRCwgU1lNQk9MLCB2YXJfcGVyX2dlbmUpICU+JSAKICBmaWx0ZXIodmFyX3Blcl9nZW5lID49IDMpICU+JSAKICBkaXN0aW5jdCgpCgpzZW5zaXRpdml0eV9tZXRhID0gCiAgc2Vuc2l0aXZpdHlfbWV0YSAlPiUgCiAgZmlsdGVyKFNZTUJPTCAlaW4lIGFjdGlvbmFibGVfZ2VuZXNfYWxsJFNZTUJPTCkgJT4lIAogIGRpc3RpbmN0KCkKaGVhZChzZW5zaXRpdml0eV9tZXRhKQoKcGxvdF9kcnVnID0gIAogIGRmX3NwbGljZV9hY3Rpb25hYmxlICU+JSAKICBmdWxsX2pvaW4oc2Vuc2l0aXZpdHlfbWV0YSwgYnkgPSBjKCJEZXBNYXBfSUQiLCJTWU1CT0wiKSkgJT4lIAogIGZpbHRlcighaXMubmEoc2Vuc2l0aXZpdHkpKSAlPiUgCiAgbXV0YXRlKHNwbGljZV9tdXRhdGlvbiA9IGFzLmNoYXJhY3RlcihzcGxpY2VfbXV0YXRpb24pKSAlPiUgCiAgbXV0YXRlKHNwbGljZV9tdXRhdGlvbiA9IGlmZWxzZShpcy5uYShzcGxpY2VfbXV0YXRpb24pLCJXVCIsIlZhciIpKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUKICBzZWxlY3QoU1lNQk9MLCBzcGxpY2VfbXV0YXRpb24sIERlcE1hcF9JRCwgc2Vuc2l0aXZpdHksIGJyb2FkX2lkLCBuYW1lKSAlPiUgCiAgZGlzdGluY3QoKSAKCiN0cmFuc2Zvcm0gc2Vuc2l0aXZpdHkgdG8gbnVtZXJpYwpwbG90X2RydWckc2Vuc2l0aXZpdHkgPSAKICBhcy5udW1lcmljKHBsb3RfZHJ1ZyRzZW5zaXRpdml0eSkKCiNyb3VuZCBzZW5zaXRpdml0eSBkYXRhIHRvIDMgZGVjaW1hbHMKcGxvdF9kcnVnJHNlbnNpdGl2aXR5ID0gCiAgcm91bmQocGxvdF9kcnVnJHNlbnNpdGl2aXR5LCBkaWdpdHMgPSAzKQoKeW91cl9mb250X3NpemUgPC0gMgoKCiAgZ2dwbG90KHBsb3RfZHJ1ZyAlPiUgIG11dGF0ZShncm91cCA9IHBhc3RlKG5hbWUsIFNZTUJPTCwgc2VwID0gIi0iKSksIGFlcyh5ID0gc2Vuc2l0aXZpdHkseCA9IHNwbGljZV9tdXRhdGlvbiwgY29sb3IgPSBzcGxpY2VfbXV0YXRpb24pKSArIAogIGdlb21fYm94cGxvdChhZXMoeCA9IHNwbGljZV9tdXRhdGlvbikpICsKICBnZW9tX3F1YXNpcmFuZG9tKG1ldGhvZCA9ICJwc2V1ZG9yYW5kb20iLGFscGhhID0gMC41LCBzaXplID0gMC41KSArIAogIHRoZW1lX2J3KCkgKwogIGZhY2V0X3dyYXAoImdyb3VwIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCJibGFjayIpKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNlbnNpdGl2aXR5IHRvIGRydWcgKHNkIGZyb20gbWVkaWFuKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgKSArIAogICAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ0LnRlc3QiLCBsYWJlbCA9ICJwLmZvcm1hdCIsIGxhYmVsLnkgPSAyLjgsIGxhYmVsLnggPSAwLjYsIHNpemUgPSB5b3VyX2ZvbnRfc2l6ZSkKICAKI2dnc2F2ZSgiLi4vZmlndXJlcy9yZXN1bHRzL21za19pbXBhY3QvZHJ1Zy9zcGxpY2VBSV9hY3Rpb25hYmxlZ2VuZXNfZHJ1Z3NlbnNpdGl2aXR5X3BlckRydWdfdF90ZXN0LnBuZyIsIGhlaWdodCA9IDIwLCB3aWR0aCA9IDIzKQoKYGBgCgpQbG90IHBlciBkcnVnLCBmaWx0ZXIgZm9yIGNlbGwgbGluZXMgd2l0aCBtb3JlIHRoYW4gMTAgdmFyaWFudHMKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0KYWN0aW9uYWJsZV9nZW5lc181ID0gCiAgZGZfc3BsaWNlX2FjdGlvbmFibGUgJT4lIAogIGdyb3VwX2J5KFNZTUJPTCkgJT4lIAogIG11dGF0ZSh2YXJfcGVyX2dlbmUgPSBsZW5ndGgoU1lNQk9MKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgc2VsZWN0KERlcE1hcF9JRCwgU1lNQk9MLCB2YXJfcGVyX2dlbmUpICU+JSAKICBmaWx0ZXIodmFyX3Blcl9nZW5lID41ICkgJT4lCiAgZGlzdGluY3QoKQoKc2Vuc2l0aXZpdHlfbWV0YV81ID0gCiAgc2Vuc2l0aXZpdHlfbWV0YSAlPiUgCiAgZmlsdGVyKFNZTUJPTCAlaW4lIGFjdGlvbmFibGVfZ2VuZXNfNSRTWU1CT0wpICU+JSAKICBkaXN0aW5jdCgpCgpoZWFkKHNlbnNpdGl2aXR5X21ldGEpCgpwbG90X2RydWcgPSAgCiAgZGZfc3BsaWNlX2FjdGlvbmFibGUgJT4lIAogIGZ1bGxfam9pbihzZW5zaXRpdml0eV9tZXRhXzUsIGJ5ID0gYygiRGVwTWFwX0lEIiwiU1lNQk9MIikpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHNlbnNpdGl2aXR5KSkgJT4lIAogIG11dGF0ZShzcGxpY2VfbXV0YXRpb24gPSBhcy5jaGFyYWN0ZXIoc3BsaWNlX211dGF0aW9uKSkgJT4lIAogIG11dGF0ZShzcGxpY2VfbXV0YXRpb24gPSBpZmVsc2UoaXMubmEoc3BsaWNlX211dGF0aW9uKSwiV1QiLCJWYXIiKSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lCiAgc2VsZWN0KFNZTUJPTCwgc3BsaWNlX211dGF0aW9uLCBEZXBNYXBfSUQsIHNlbnNpdGl2aXR5LCBicm9hZF9pZCwgbmFtZSkgJT4lIAogIGRpc3RpbmN0KCkgCgojdHJhbnNmb3JtIHNlbnNpdGl2aXR5IHRvIG51bWVyaWMKcGxvdF9kcnVnJHNlbnNpdGl2aXR5ID0gCiAgYXMubnVtZXJpYyhwbG90X2RydWckc2Vuc2l0aXZpdHkpCgojcm91bmQgc2Vuc2l0aXZpdHkgZGF0YSB0byAzIGRlY2ltYWxzCnBsb3RfZHJ1ZyRzZW5zaXRpdml0eSA9IAogIHJvdW5kKHBsb3RfZHJ1ZyRzZW5zaXRpdml0eSwgZGlnaXRzID0gMykKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwfQojI1BMT1QKICBnZ3Bsb3QocGxvdF9kcnVnICU+JSAgbXV0YXRlKGdyb3VwID0gcGFzdGUobmFtZSwgU1lNQk9MLCBzZXAgPSAiLSIpKSwgYWVzKHkgPSBzZW5zaXRpdml0eSx4ID0gc3BsaWNlX211dGF0aW9uKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKHggPSBzcGxpY2VfbXV0YXRpb24sIGNvbG9yID0gc3BsaWNlX211dGF0aW9uKSkgKwogICNnZW9tX2ppdHRlcihhbHBoYSA9IDAuNSwgc2l6ZSA9IDAuNSkgKwogIGdlb21fYmVlc3dhcm0obWV0aG9kID0gInBzZXVkb3JhbmRvbSIsYWxwaGEgPSAwLjIsIHNpemUgPSAwLjUpICsgCiAgdGhlbWVfYncoKSArCiAgZmFjZXRfd3JhcCgiZ3JvdXAiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInJlZCIsImdyYXkiKSkgKwogIHhsYWIoIiIpICsKICB5bGFiKCJTZW5zaXRpdml0eSB0byBkcnVnIChzZCBmcm9tIG1lZGlhbikiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIAogICAgICAgICkgKyAKICAgIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAidC50ZXN0IiwgbGFiZWwgPSAicC5mb3JtYXQiLCBsYWJlbC55ID0gLTYsIGxhYmVsLnggPSAxKQogIAojZ2dzYXZlKCIuLi9maWd1cmVzL3Jlc3VsdHMvbXNrX2ltcGFjdC9kcnVnL3NwbGljZUFJX2FjdGlvbmFibGVnZW5lc19kcnVnc2Vuc2l0aXZpdHlfcGVyRHJ1Z19tb3JlNV90dGVzdC5wbmciLCBoZWlnaHQgPSAxMiwgd2lkdGggPSAxMCkKYGBgClJlcGVhdCBwbG90IHdpdGhvdXQgZmFjZXRpbmcsIHBlciBkaXNlYXNlCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9CiMjQU5OT1RBVEUgRElTRUFTRQpkaXNlYXNlID0gCiAgY2NsZSAlPiUgCiAgc2VsZWN0KERlcE1hcF9JRCwgcHJpbWFyeV9kaXNlYXNlKSAlPiUgCiAgZGlzdGluY3QoKQoKc2Vuc2l0aXZpdHlfbWV0YV9kaXMgPSAKICBzZW5zaXRpdml0eV9tZXRhICU+JSAKICBmaWx0ZXIoU1lNQk9MICVpbiUgYWN0aW9uYWJsZV9nZW5lc19hbGwkU1lNQk9MKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbGVmdF9qb2luKGRpc2Vhc2UsIGJ5ID0gIkRlcE1hcF9JRCIpCgpwbG90X2RydWdfZGlzID0gCiAgZGZfc3BsaWNlX2FjdGlvbmFibGUgJT4lIAogIGZ1bGxfam9pbihzZW5zaXRpdml0eV9tZXRhX2RpcywgYnkgPSBjKCJEZXBNYXBfSUQiLCJTWU1CT0wiKSkgJT4lIAogIGZpbHRlcighaXMubmEoc2Vuc2l0aXZpdHkpKSAlPiUgCiAgbXV0YXRlKHNwbGljZV9tdXRhdGlvbiA9IGFzLmNoYXJhY3RlcihzcGxpY2VfbXV0YXRpb24pKSAlPiUgCiAgbXV0YXRlKHNwbGljZV9tdXRhdGlvbiA9IGlmZWxzZShpcy5uYShzcGxpY2VfbXV0YXRpb24pLCJXVCIsIlZhciIpKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUKICBzZWxlY3QoU1lNQk9MLCBzcGxpY2VfbXV0YXRpb24sIERlcE1hcF9JRCwgc2Vuc2l0aXZpdHksIGJyb2FkX2lkLCBuYW1lLCBwcmltYXJ5X2Rpc2Vhc2UueSkgJT4lIAogIHJlbmFtZSgicHJpbWFyeV9kaXNlYXNlIiA9ICJwcmltYXJ5X2Rpc2Vhc2UueSIpCgojdHJhbnNmb3JtIHNlbnNpdGl2aXR5IHRvIG51bWVyaWMKcGxvdF9kcnVnX2RpcyRzZW5zaXRpdml0eSA9IAogIGFzLm51bWVyaWMocGxvdF9kcnVnX2RpcyRzZW5zaXRpdml0eSkKCiNyb3VuZCBzZW5zaXRpdml0eSBkYXRhIHRvIDMgZGVjaW1hbHMKcGxvdF9kcnVnX2RpcyRzZW5zaXRpdml0eSA9IAogIHJvdW5kKHBsb3RfZHJ1Z19kaXMkc2Vuc2l0aXZpdHksIGRpZ2l0cyA9IDMpCgojI1BMT1QKICBnZ3Bsb3QocGxvdF9kcnVnX2RpcywgYWVzKHkgPSBzZW5zaXRpdml0eSx4ID0gc3BsaWNlX211dGF0aW9uKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKHggPSBzcGxpY2VfbXV0YXRpb24sIGNvbG9yID0gc3BsaWNlX211dGF0aW9uKSkgKwogIGdlb21fcXVhc2lyYW5kb20obWV0aG9kID0gInBzZXVkb3JhbmRvbSIsYWxwaGEgPSAwLjUsIHNpemUgPSAwLjUpICsgCiAgZmFjZXRfd3JhcCgicHJpbWFyeV9kaXNlYXNlIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCJibGFjayIpKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNlbnNpdGl2aXR5IHRvIGRydWcgKHNkIGZyb20gbWVkaWFuKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgKSArIAogICAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ0LnRlc3QiLCBsYWJlbCA9ICJwLmZvcm1hdCIsIGxhYmVsLnkgPSAyLjUsIGxhYmVsLnggPSAwLjgpCgpnZ3NhdmUoIi4uL2ZpZ3VyZXMvcmVzdWx0cy9tc2tfaW1wYWN0L2RydWcvc3BsaWNlQUlfYWN0aW9uYWJsZWdlbmVzX2RydWdzZW5zaXRpdml0eV90dGVzdF9QRVJDQU5DRVIucG5nIiwgaGVpZ2h0ID0gMTAsIHdpZHRoID0gMTApCmBgYAoKCgo=